package com.news.service.impl;

import com.news.model.NewsItem;
import com.news.model.NewsSource;
import com.news.service.NewsFetcher;
import com.news.util.HttpUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;

/**
 * 通用新闻获取器
 * 处理微博、百度、知乎等其他新闻源
 */
public class GeneralNewsFetcher implements NewsFetcher {
    
    private static final Logger logger = LoggerFactory.getLogger(GeneralNewsFetcher.class);
    private final NewsSource newsSource;
    private final Random random = new Random();
    
    public GeneralNewsFetcher(NewsSource newsSource) {
        this.newsSource = newsSource;
    }
    
    @Override
    public NewsSource getSource() {
        return newsSource;
    }
    
    @Override
    public List<NewsItem> fetchHotNews(int limit) {
        List<NewsItem> newsItems = new ArrayList<>();
        
        try {
            switch (newsSource) {
                case WEIBO:
                    newsItems.addAll(getMockWeiboNews(limit));
                    break;
                case BAIDU:
                    newsItems.addAll(getMockBaiduNews(limit));
                    break;
                case ZHIHU:
                    newsItems.addAll(getMockZhihuNews(limit));
                    break;
                case TOUTIAO:
                    newsItems.addAll(getMockToutiaoNews(limit));
                    break;
                default:
                    logger.warn("不支持的新闻源: {}", newsSource);
            }
            
            logger.info("成功获取{}热门内容 {} 条", newsSource.getDisplayName(), newsItems.size());
            
        } catch (Exception e) {
            logger.error("获取{}热门内容失败", newsSource.getDisplayName(), e);
        }
        
        return newsItems;
    }
    
    @Override
    public List<NewsItem> searchNews(String keyword, int limit) {
        List<NewsItem> newsItems = new ArrayList<>();
        
        try {
            // 生成搜索结果
            for (int i = 0; i < limit; i++) {
                NewsItem item = new NewsItem();
                item.setTitle("【搜索】" + keyword + " - " + newsSource.getDisplayName() + "相关内容 " + (i + 1));
                item.setContent("与 " + keyword + " 相关的详细内容，来自" + newsSource.getDisplayName() + "...");
                item.setSource(newsSource.getDisplayName());
                item.setUrl(newsSource.getBaseUrl() + "/search?q=" + keyword + "&id=" + i);
                item.setPublishTime(LocalDateTime.now().minusHours(i));
                item.setCategory("搜索");
                item.setHotScore(random.nextInt(5000) + 1000);
                item.setAuthor("用户" + (i + 1));
                
                newsItems.add(item);
            }
            
            logger.info("成功搜索{}内容 '{}' {} 条", newsSource.getDisplayName(), keyword, newsItems.size());
            
        } catch (Exception e) {
            logger.error("搜索{}内容失败", newsSource.getDisplayName(), e);
        }
        
        return newsItems;
    }
    
    @Override
    public boolean isAvailable() {
        try {
            return HttpUtil.isAccessible(newsSource.getBaseUrl());
        } catch (Exception e) {
            logger.warn("{}服务不可用", newsSource.getDisplayName(), e);
            return false;
        }
    }
    
    /**
     * 获取模拟的微博热门内容
     */
    private List<NewsItem> getMockWeiboNews(int limit) {
        List<NewsItem> newsItems = new ArrayList<>();
        
        String[] titles = {
            "微博热搜：最新社会热点事件讨论",
            "明星动态：娱乐圈最新消息",
            "科技前沿：互联网行业最新发展",
            "生活分享：日常生活趣事",
            "时事评论：当前热点事件分析",
            "文化传播：传统文化与现代生活",
            "体育赛事：最新比赛结果和分析",
            "教育资讯：学习方法和教育政策"
        };
        
        return generateMockNews(newsItems, titles, limit, "微博话题");
    }
    
    /**
     * 获取模拟的百度热门内容
     */
    private List<NewsItem> getMockBaiduNews(int limit) {
        List<NewsItem> newsItems = new ArrayList<>();
        
        String[] titles = {
            "百度热榜：今日最热门搜索内容",
            "新闻资讯：国内外重要新闻",
            "技术资讯：最新科技发展动态",
            "生活服务：实用生活信息",
            "健康养生：健康生活小贴士",
            "财经资讯：经济市场最新动态",
            "汽车资讯：最新汽车行业新闻",
            "房产信息：楼市最新动态"
        };
        
        return generateMockNews(newsItems, titles, limit, "热门资讯");
    }
    
    /**
     * 获取模拟的知乎热门内容
     */
    private List<NewsItem> getMockZhihuNews(int limit) {
        List<NewsItem> newsItems = new ArrayList<>();
        
        String[] titles = {
            "知乎热榜：如何看待最新社会现象？",
            "专业问答：技术领域深度讨论",
            "生活感悟：人生经验分享",
            "学术讨论：学术前沿话题",
            "职场经验：工作中的实用技巧",
            "投资理财：理财知识和经验",
            "文化艺术：艺术作品赏析",
            "科学探索：科学知识普及"
        };
        
        return generateMockNews(newsItems, titles, limit, "热门问答");
    }
    
    /**
     * 获取模拟的今日头条热门内容
     */
    private List<NewsItem> getMockToutiaoNews(int limit) {
        List<NewsItem> newsItems = new ArrayList<>();
        
        String[] titles = {
            "今日头条：重要新闻事件报道",
            "社会新闻：民生热点关注",
            "科技新闻：最新科技突破",
            "娱乐新闻：影视娱乐资讯",
            "体育新闻：体育赛事报道",
            "财经新闻：金融市场动态",
            "国际新闻：国际重要事件",
            "本地新闻：地方新闻资讯"
        };
        
        return generateMockNews(newsItems, titles, limit, "今日资讯");
    }
    
    /**
     * 生成模拟新闻数据
     */
    private List<NewsItem> generateMockNews(List<NewsItem> newsItems, String[] titles, int limit, String category) {
        for (int i = 0; i < Math.min(limit, titles.length); i++) {
            NewsItem item = new NewsItem();
            item.setTitle(titles[i]);
            item.setContent("这是来自" + newsSource.getDisplayName() + "的热门内容，包含了详细的信息和分析...");
            item.setSource(newsSource.getDisplayName());
            item.setUrl(newsSource.getBaseUrl() + "/item/" + (System.currentTimeMillis() + i));
            item.setPublishTime(LocalDateTime.now().minusHours(i));
            item.setCategory(category);
            item.setHotScore(random.nextInt(8000) + 2000);
            item.setAuthor("用户" + (random.nextInt(1000) + 1));
            
            newsItems.add(item);
        }
        
        return newsItems;
    }
} 